{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import os\n",
    "import tqdm\n",
    "import random\n",
    "import numpy as np\n",
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "from sklearn.metrics import mean_absolute_error\n",
    "from sklearn.preprocessing import StandardScaler\n",
    "from sklearn.model_selection import train_test_split\n",
    "\n",
    "import tensorflow as tf\n",
    "from tensorflow.keras.models import *\n",
    "from tensorflow.keras.layers import *\n",
    "from tensorflow.keras.callbacks import *\n",
    "from tensorflow.keras import backend as K"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(18249, 13)\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>AveragePrice</th>\n",
       "      <th>Total Volume</th>\n",
       "      <th>4046</th>\n",
       "      <th>4225</th>\n",
       "      <th>4770</th>\n",
       "      <th>Total Bags</th>\n",
       "      <th>Small Bags</th>\n",
       "      <th>Large Bags</th>\n",
       "      <th>XLarge Bags</th>\n",
       "      <th>type</th>\n",
       "      <th>year</th>\n",
       "      <th>region</th>\n",
       "      <th>test_flag</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Date</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <td>2015-01-04</td>\n",
       "      <td>1.75</td>\n",
       "      <td>27365.89</td>\n",
       "      <td>9307.34</td>\n",
       "      <td>3844.81</td>\n",
       "      <td>615.28</td>\n",
       "      <td>13598.46</td>\n",
       "      <td>13061.10</td>\n",
       "      <td>537.36</td>\n",
       "      <td>0.0</td>\n",
       "      <td>organic</td>\n",
       "      <td>2015</td>\n",
       "      <td>Southeast</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>2015-01-04</td>\n",
       "      <td>1.49</td>\n",
       "      <td>17723.17</td>\n",
       "      <td>1189.35</td>\n",
       "      <td>15628.27</td>\n",
       "      <td>0.00</td>\n",
       "      <td>905.55</td>\n",
       "      <td>905.55</td>\n",
       "      <td>0.00</td>\n",
       "      <td>0.0</td>\n",
       "      <td>organic</td>\n",
       "      <td>2015</td>\n",
       "      <td>Chicago</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>2015-01-04</td>\n",
       "      <td>1.68</td>\n",
       "      <td>2896.72</td>\n",
       "      <td>161.68</td>\n",
       "      <td>206.96</td>\n",
       "      <td>0.00</td>\n",
       "      <td>2528.08</td>\n",
       "      <td>2528.08</td>\n",
       "      <td>0.00</td>\n",
       "      <td>0.0</td>\n",
       "      <td>organic</td>\n",
       "      <td>2015</td>\n",
       "      <td>HarrisburgScranton</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>2015-01-04</td>\n",
       "      <td>1.52</td>\n",
       "      <td>54956.80</td>\n",
       "      <td>3013.04</td>\n",
       "      <td>35456.88</td>\n",
       "      <td>1561.70</td>\n",
       "      <td>14925.18</td>\n",
       "      <td>11264.80</td>\n",
       "      <td>3660.38</td>\n",
       "      <td>0.0</td>\n",
       "      <td>conventional</td>\n",
       "      <td>2015</td>\n",
       "      <td>Pittsburgh</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>2015-01-04</td>\n",
       "      <td>1.64</td>\n",
       "      <td>1505.12</td>\n",
       "      <td>1.27</td>\n",
       "      <td>1129.50</td>\n",
       "      <td>0.00</td>\n",
       "      <td>374.35</td>\n",
       "      <td>186.67</td>\n",
       "      <td>187.68</td>\n",
       "      <td>0.0</td>\n",
       "      <td>organic</td>\n",
       "      <td>2015</td>\n",
       "      <td>Boise</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "            AveragePrice  Total Volume     4046      4225     4770  \\\n",
       "Date                                                                 \n",
       "2015-01-04          1.75      27365.89  9307.34   3844.81   615.28   \n",
       "2015-01-04          1.49      17723.17  1189.35  15628.27     0.00   \n",
       "2015-01-04          1.68       2896.72   161.68    206.96     0.00   \n",
       "2015-01-04          1.52      54956.80  3013.04  35456.88  1561.70   \n",
       "2015-01-04          1.64       1505.12     1.27   1129.50     0.00   \n",
       "\n",
       "            Total Bags  Small Bags  Large Bags  XLarge Bags          type  \\\n",
       "Date                                                                        \n",
       "2015-01-04    13598.46    13061.10      537.36          0.0       organic   \n",
       "2015-01-04      905.55      905.55        0.00          0.0       organic   \n",
       "2015-01-04     2528.08     2528.08        0.00          0.0       organic   \n",
       "2015-01-04    14925.18    11264.80     3660.38          0.0  conventional   \n",
       "2015-01-04      374.35      186.67      187.68          0.0       organic   \n",
       "\n",
       "            year              region  test_flag  \n",
       "Date                                             \n",
       "2015-01-04  2015           Southeast      False  \n",
       "2015-01-04  2015             Chicago      False  \n",
       "2015-01-04  2015  HarrisburgScranton      False  \n",
       "2015-01-04  2015          Pittsburgh      False  \n",
       "2015-01-04  2015               Boise      False  "
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "### READ DATASET ###\n",
    "\n",
    "df = pd.read_csv('avocado.csv', index_col=0, parse_dates=['Date'])\n",
    "df.sort_values('Date', inplace=True)\n",
    "df.set_index('Date', inplace=True)\n",
    "df['test_flag'] = (df['year']==2018)\n",
    "\n",
    "print(df.shape)\n",
    "df.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "### PLOT SERIES FOR SINGLE MARKET OF SELECTED AVOCADO TYPE ###\n",
    "\n",
    "def plot_seris(county, typ):\n",
    "    \n",
    "    plt.figure(figsize=(9,6))\n",
    "    \n",
    "    df[(df['type']==typ)&(df['region']==county)&(df['test_flag']==False)]['AveragePrice'].plot()\n",
    "    df[(df['type']==typ)&(df['region']==county)&(df['test_flag']==True)]['AveragePrice'].plot()\n",
    "    \n",
    "    plt.title('AveragePrice'+' '+typ.upper()+' '+county)\n",
    "    plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 648x432 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "reg_train = plot_seris('NewYork','conventional')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "### CREATE GENERATOR FOR LSTM WINDOWS AND LABELS ###\n",
    "\n",
    "sequence_length = 4\n",
    "\n",
    "\n",
    "def set_seed(seed):\n",
    "    \n",
    "    tf.random.set_seed(seed)\n",
    "    os.environ['PYTHONHASHSEED'] = str(seed)\n",
    "    np.random.seed(seed)\n",
    "    random.seed(seed)\n",
    "\n",
    "def gen_sequence(id_df, seq_length, seq_cols):\n",
    "\n",
    "    data_matrix = id_df[seq_cols].values\n",
    "    num_elements = data_matrix.shape[0]\n",
    "\n",
    "    for start, stop in zip(range(0, num_elements-seq_length), range(seq_length, num_elements)):\n",
    "        yield data_matrix[start:stop, :]\n",
    "\n",
    "def gen_labels(id_df, seq_length, label):\n",
    "\n",
    "    data_matrix = id_df[label].values\n",
    "    num_elements = data_matrix.shape[0]\n",
    "\n",
    "    return data_matrix[seq_length:num_elements, :]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(33042, 4, 9) (33042, 1)\n",
      "(1728, 4, 9) (1728, 1)\n"
     ]
    }
   ],
   "source": [
    "### CREATE TRAIN/TEST PRICE DATA ###\n",
    "\n",
    "col = ['AveragePrice','Total Volume','4046','4225','4770','Total Bags','Small Bags','Large Bags','XLarge Bags']\n",
    "\n",
    "X_train, X_test = [], []\n",
    "y_train, y_test = [], []\n",
    "\n",
    "for (county,typ,is_test), _df in df.groupby([\"region\", \"type\", \"test_flag\"]):\n",
    "    \n",
    "    for seq in gen_sequence(_df, sequence_length, col):            \n",
    "        \n",
    "        if is_test:\n",
    "            X_test.append(seq)\n",
    "        else:\n",
    "            X_train.append(seq)\n",
    "\n",
    "        if is_test:\n",
    "            X_test.append(seq)\n",
    "        else:\n",
    "            X_train.append(seq)\n",
    "                \n",
    "    for seq in gen_labels(_df, sequence_length, ['AveragePrice']):\n",
    "        \n",
    "        if is_test:\n",
    "            y_test.append(seq)\n",
    "        else:\n",
    "            y_train.append(seq)\n",
    "\n",
    "        if is_test:\n",
    "            y_test.append(seq)\n",
    "        else:\n",
    "            y_train.append(seq)      \n",
    "        \n",
    "        \n",
    "X_train = np.asarray(X_train)\n",
    "y_train = np.asarray(y_train)\n",
    "X_test = np.asarray(X_test)\n",
    "y_test = np.asarray(y_test)\n",
    "\n",
    "print(X_train.shape, y_train.shape)\n",
    "print(X_test.shape, y_test.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "scaler = StandardScaler()\n",
    "X_train = scaler.fit_transform(X_train.reshape(-1,X_train.shape[-1])).reshape(X_train.shape)\n",
    "X_test = scaler.transform(X_test.reshape(-1,X_test.shape[-1])).reshape(X_test.shape)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# FORECASTER + AUTOENCODER"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 1/100\n",
      "259/259 [==============================] - 4s 14ms/step - loss: 0.4868 - val_loss: 0.4005\n",
      "Epoch 2/100\n",
      "259/259 [==============================] - 3s 12ms/step - loss: 0.3867 - val_loss: 0.3809\n",
      "Epoch 3/100\n",
      "259/259 [==============================] - 3s 12ms/step - loss: 0.3761 - val_loss: 0.3714\n",
      "Epoch 4/100\n",
      "259/259 [==============================] - 3s 12ms/step - loss: 0.3726 - val_loss: 0.3717\n",
      "Epoch 5/100\n",
      "259/259 [==============================] - 3s 12ms/step - loss: 0.3718 - val_loss: 0.3696\n",
      "Epoch 6/100\n",
      "259/259 [==============================] - 4s 14ms/step - loss: 0.3679 - val_loss: 0.3647\n",
      "Epoch 7/100\n",
      "259/259 [==============================] - 3s 12ms/step - loss: 0.3641 - val_loss: 0.3657\n",
      "Epoch 8/100\n",
      "259/259 [==============================] - 3s 12ms/step - loss: 0.3648 - val_loss: 0.3616\n",
      "Epoch 9/100\n",
      "259/259 [==============================] - 3s 12ms/step - loss: 0.3631 - val_loss: 0.3637\n",
      "Epoch 10/100\n",
      "259/259 [==============================] - 3s 13ms/step - loss: 0.3632 - val_loss: 0.3630\n",
      "Epoch 11/100\n",
      "259/259 [==============================] - 3s 12ms/step - loss: 0.3626 - val_loss: 0.3626\n",
      "Epoch 12/100\n",
      "259/259 [==============================] - 3s 12ms/step - loss: 0.3620 - val_loss: 0.3626\n",
      "Epoch 13/100\n",
      "259/259 [==============================] - 3s 12ms/step - loss: 0.3603 - val_loss: 0.3598\n",
      "Epoch 14/100\n",
      "259/259 [==============================] - 3s 12ms/step - loss: 0.3611 - val_loss: 0.3618\n",
      "Epoch 15/100\n",
      "259/259 [==============================] - 3s 13ms/step - loss: 0.3613 - val_loss: 0.3606\n",
      "Epoch 16/100\n",
      "259/259 [==============================] - 3s 13ms/step - loss: 0.3598 - val_loss: 0.3613\n",
      "Epoch 17/100\n",
      "259/259 [==============================] - 3s 12ms/step - loss: 0.3596 - val_loss: 0.3606\n",
      "Epoch 18/100\n",
      "259/259 [==============================] - 3s 13ms/step - loss: 0.3574 - val_loss: 0.3600\n",
      "Epoch 19/100\n",
      "259/259 [==============================] - 3s 12ms/step - loss: 0.3579 - val_loss: 0.3581\n",
      "Epoch 20/100\n",
      "259/259 [==============================] - 3s 12ms/step - loss: 0.3573 - val_loss: 0.3573\n",
      "Epoch 21/100\n",
      "259/259 [==============================] - 3s 12ms/step - loss: 0.3570 - val_loss: 0.3569\n",
      "Epoch 22/100\n",
      "259/259 [==============================] - 3s 12ms/step - loss: 0.3571 - val_loss: 0.3569\n",
      "Epoch 23/100\n",
      "259/259 [==============================] - 3s 12ms/step - loss: 0.3570 - val_loss: 0.3568\n",
      "Epoch 24/100\n",
      "259/259 [==============================] - 3s 13ms/step - loss: 0.3577 - val_loss: 0.3576\n",
      "Epoch 25/100\n",
      "259/259 [==============================] - 3s 13ms/step - loss: 0.3589 - val_loss: 0.3594\n",
      "Epoch 26/100\n",
      "259/259 [==============================] - 3s 12ms/step - loss: 0.3576 - val_loss: 0.3579\n",
      "Epoch 27/100\n",
      "253/259 [============================>.] - ETA: 0s - loss: 0.3567Restoring model weights from the end of the best epoch.\n",
      "259/259 [==============================] - 3s 13ms/step - loss: 0.3565 - val_loss: 0.3577\n",
      "Epoch 00027: early stopping\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<tensorflow.python.keras.callbacks.History at 0x1c0ee0075f8>"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "set_seed(33)\n",
    "\n",
    "### DEFINE LSTM AUTOENCODER ###\n",
    "\n",
    "inputs_ae = Input(shape=(X_train.shape[1:]))\n",
    "encoded_ae = LSTM(128, return_sequences=True, dropout=0.5)(inputs_ae, training=True)\n",
    "decoded_ae = LSTM(32, return_sequences=True, dropout=0.5)(encoded_ae, training=True)\n",
    "out_ae = TimeDistributed(Dense(1))(decoded_ae)\n",
    "\n",
    "sequence_autoencoder = Model(inputs_ae, out_ae)\n",
    "sequence_autoencoder.compile(optimizer='adam', loss='mse')\n",
    "\n",
    "### TRAIN AUTOENCODER ###\n",
    "es = EarlyStopping(patience=6, verbose=2, min_delta=0.001, monitor='val_loss', mode='auto', restore_best_weights=True)\n",
    "sequence_autoencoder.fit(X_train, X_train, validation_data=(X_train, X_train),\n",
    "                         batch_size=128, epochs=100, verbose=1, callbacks=[es])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "((33042, 4, 137), (1728, 4, 137))"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "### ENCODE PRICE AND CONCATENATE REGRESSORS ###\n",
    "\n",
    "encoder = Model(inputs_ae, encoded_ae)\n",
    "X_train_ = np.concatenate([X_train, encoder.predict(X_train)], axis=-1)\n",
    "X_test_ = np.concatenate([X_test, encoder.predict(X_test)], axis=-1)\n",
    "\n",
    "X_train_.shape, X_test_.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 1/100\n",
      "259/259 [==============================] - 5s 17ms/step - loss: 0.1181 - val_loss: 0.0489\n",
      "Epoch 2/100\n",
      "259/259 [==============================] - 4s 15ms/step - loss: 0.0475 - val_loss: 0.0457\n",
      "Epoch 3/100\n",
      "259/259 [==============================] - 4s 15ms/step - loss: 0.0444 - val_loss: 0.0432\n",
      "Epoch 4/100\n",
      "259/259 [==============================] - 4s 15ms/step - loss: 0.0427 - val_loss: 0.0413\n",
      "Epoch 5/100\n",
      "259/259 [==============================] - 4s 16ms/step - loss: 0.0418 - val_loss: 0.0404\n",
      "Epoch 6/100\n",
      "259/259 [==============================] - 4s 15ms/step - loss: 0.0406 - val_loss: 0.0408\n",
      "Epoch 7/100\n",
      "259/259 [==============================] - 4s 15ms/step - loss: 0.0400 - val_loss: 0.0393\n",
      "Epoch 8/100\n",
      "259/259 [==============================] - 4s 15ms/step - loss: 0.0392 - val_loss: 0.0388\n",
      "Epoch 9/100\n",
      "259/259 [==============================] - 4s 15ms/step - loss: 0.0385 - val_loss: 0.0381\n",
      "Epoch 10/100\n",
      "259/259 [==============================] - 4s 15ms/step - loss: 0.0381 - val_loss: 0.0373\n",
      "Epoch 11/100\n",
      "259/259 [==============================] - 4s 15ms/step - loss: 0.0379 - val_loss: 0.0376\n",
      "Epoch 12/100\n",
      "259/259 [==============================] - 4s 16ms/step - loss: 0.0380 - val_loss: 0.0370\n",
      "Epoch 13/100\n",
      "259/259 [==============================] - 4s 15ms/step - loss: 0.0374 - val_loss: 0.0384\n",
      "Epoch 14/100\n",
      "259/259 [==============================] - 4s 15ms/step - loss: 0.0364 - val_loss: 0.0371\n",
      "Epoch 15/100\n",
      "259/259 [==============================] - 4s 15ms/step - loss: 0.0365 - val_loss: 0.0362\n",
      "Epoch 16/100\n",
      "259/259 [==============================] - 4s 15ms/step - loss: 0.0364 - val_loss: 0.0366\n",
      "Epoch 17/100\n",
      "259/259 [==============================] - 4s 15ms/step - loss: 0.0367 - val_loss: 0.0359\n",
      "Epoch 18/100\n",
      "259/259 [==============================] - 4s 15ms/step - loss: 0.0362 - val_loss: 0.0356\n",
      "Epoch 19/100\n",
      "259/259 [==============================] - 4s 15ms/step - loss: 0.0360 - val_loss: 0.0356\n",
      "Epoch 20/100\n",
      "259/259 [==============================] - 4s 15ms/step - loss: 0.0360 - val_loss: 0.0352\n",
      "Epoch 21/100\n",
      "259/259 [==============================] - 4s 15ms/step - loss: 0.0353 - val_loss: 0.0354\n",
      "Epoch 22/100\n",
      "259/259 [==============================] - 4s 15ms/step - loss: 0.0358 - val_loss: 0.0351\n",
      "Epoch 23/100\n",
      "254/259 [============================>.] - ETA: 0s - loss: 0.0353Restoring model weights from the end of the best epoch.\n",
      "259/259 [==============================] - 4s 15ms/step - loss: 0.0354 - val_loss: 0.0350\n",
      "Epoch 00023: early stopping\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<tensorflow.python.keras.callbacks.History at 0x1c08027aef0>"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "set_seed(33)\n",
    "\n",
    "### DEFINE FORECASTER ###\n",
    "\n",
    "inputs = Input(shape=(X_train_.shape[1:]))\n",
    "lstm = LSTM(128, return_sequences=True, dropout=0.5)(inputs, training=True)\n",
    "lstm = LSTM(32, return_sequences=False, dropout=0.5)(lstm, training=True)\n",
    "dense = Dense(50)(lstm)\n",
    "out = Dense(1)(dense)\n",
    "\n",
    "model = Model(inputs, out)\n",
    "model.compile(loss='mse', optimizer='adam')\n",
    "\n",
    "### FIT FORECASTER ###\n",
    "es = EarlyStopping(patience=6, verbose=2, min_delta=0.001, monitor='val_loss', mode='auto', restore_best_weights=True)\n",
    "model.fit(X_train_, y_train, validation_data=(X_train_, y_train), \n",
    "          epochs=100, batch_size=128, verbose=1, callbacks=[es])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|████████████████████████████████████████████████████████████████████████████████| 100/100 [00:16<00:00,  6.08it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.12049458980871436 0.0013504556151708717\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n"
     ]
    }
   ],
   "source": [
    "### COMPUTE STOCHASTIC DROPOUT ###\n",
    "\n",
    "scores = []\n",
    "for i in tqdm.tqdm(range(0,100)):\n",
    "    scores.append(mean_absolute_error(y_test, model.predict(X_test_).ravel()))\n",
    "\n",
    "print(np.mean(scores), np.std(scores))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "results = {'LSTM':None, 'AE+LSTM':None}\n",
    "results['AE+LSTM'] = {'mean':np.mean(scores), 'std':np.std(scores)}"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# SIMPLE FORECASTER"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 1/100\n",
      "259/259 [==============================] - 4s 15ms/step - loss: 0.1734 - val_loss: 0.0569\n",
      "Epoch 2/100\n",
      "259/259 [==============================] - 3s 13ms/step - loss: 0.0558 - val_loss: 0.0556\n",
      "Epoch 3/100\n",
      "259/259 [==============================] - 3s 13ms/step - loss: 0.0527 - val_loss: 0.0502\n",
      "Epoch 4/100\n",
      "259/259 [==============================] - 3s 12ms/step - loss: 0.0511 - val_loss: 0.0497\n",
      "Epoch 5/100\n",
      "259/259 [==============================] - 3s 12ms/step - loss: 0.0497 - val_loss: 0.0481\n",
      "Epoch 6/100\n",
      "259/259 [==============================] - 3s 12ms/step - loss: 0.0483 - val_loss: 0.0478\n",
      "Epoch 7/100\n",
      "259/259 [==============================] - 3s 12ms/step - loss: 0.0475 - val_loss: 0.0470\n",
      "Epoch 8/100\n",
      "259/259 [==============================] - 3s 12ms/step - loss: 0.0469 - val_loss: 0.0463\n",
      "Epoch 9/100\n",
      "259/259 [==============================] - 3s 13ms/step - loss: 0.0464 - val_loss: 0.0458\n",
      "Epoch 10/100\n",
      "259/259 [==============================] - 3s 13ms/step - loss: 0.0454 - val_loss: 0.0463\n",
      "Epoch 11/100\n",
      "259/259 [==============================] - 3s 12ms/step - loss: 0.0454 - val_loss: 0.0451\n",
      "Epoch 12/100\n",
      "259/259 [==============================] - 3s 12ms/step - loss: 0.0453 - val_loss: 0.0442\n",
      "Epoch 13/100\n",
      "259/259 [==============================] - 3s 12ms/step - loss: 0.0450 - val_loss: 0.0451\n",
      "Epoch 14/100\n",
      "259/259 [==============================] - 3s 13ms/step - loss: 0.0441 - val_loss: 0.0452\n",
      "Epoch 15/100\n",
      "259/259 [==============================] - 3s 13ms/step - loss: 0.0442 - val_loss: 0.0440\n",
      "Epoch 16/100\n",
      "259/259 [==============================] - 3s 12ms/step - loss: 0.0449 - val_loss: 0.0442\n",
      "Epoch 17/100\n",
      "259/259 [==============================] - 3s 13ms/step - loss: 0.0441 - val_loss: 0.0436\n",
      "Epoch 18/100\n",
      "259/259 [==============================] - 3s 12ms/step - loss: 0.0438 - val_loss: 0.0431\n",
      "Epoch 19/100\n",
      "259/259 [==============================] - 3s 12ms/step - loss: 0.0439 - val_loss: 0.0456\n",
      "Epoch 20/100\n",
      "259/259 [==============================] - 3s 12ms/step - loss: 0.0440 - val_loss: 0.0440\n",
      "Epoch 21/100\n",
      "259/259 [==============================] - 3s 13ms/step - loss: 0.0428 - val_loss: 0.0426\n",
      "Epoch 22/100\n",
      "259/259 [==============================] - 3s 13ms/step - loss: 0.0439 - val_loss: 0.0466\n",
      "Epoch 23/100\n",
      "259/259 [==============================] - 3s 13ms/step - loss: 0.0434 - val_loss: 0.0426\n",
      "Epoch 24/100\n",
      "259/259 [==============================] - 3s 12ms/step - loss: 0.0425 - val_loss: 0.0420\n",
      "Epoch 25/100\n",
      "259/259 [==============================] - 3s 13ms/step - loss: 0.0423 - val_loss: 0.0421\n",
      "Epoch 26/100\n",
      "259/259 [==============================] - 3s 12ms/step - loss: 0.0423 - val_loss: 0.0423\n",
      "Epoch 27/100\n",
      "259/259 [==============================] - 3s 13ms/step - loss: 0.0431 - val_loss: 0.0430\n",
      "Epoch 28/100\n",
      "259/259 [==============================] - 3s 13ms/step - loss: 0.0422 - val_loss: 0.0428\n",
      "Epoch 29/100\n",
      "259/259 [==============================] - 4s 14ms/step - loss: 0.0419 - val_loss: 0.0415\n",
      "Epoch 30/100\n",
      "258/259 [============================>.] - ETA: 0s - loss: 0.0419Restoring model weights from the end of the best epoch.\n",
      "259/259 [==============================] - 3s 13ms/step - loss: 0.0419 - val_loss: 0.0423\n",
      "Epoch 00030: early stopping\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<tensorflow.python.keras.callbacks.History at 0x1c083998fd0>"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "set_seed(33)\n",
    "\n",
    "### DEFINE FORECASTER ###\n",
    "\n",
    "inputs = Input(shape=(X_train.shape[1:]))\n",
    "lstm = LSTM(128, return_sequences=True, dropout=0.5)(inputs, training=True)\n",
    "lstm = LSTM(32, return_sequences=False, dropout=0.5)(lstm, training=True)\n",
    "dense = Dense(50)(lstm)\n",
    "out = Dense(1)(dense)\n",
    "\n",
    "model = Model(inputs, out)\n",
    "model.compile(loss='mse', optimizer='adam')\n",
    "\n",
    "### FIT FORECASTER ###\n",
    "es = EarlyStopping(patience=6, verbose=2, min_delta=0.001, monitor='val_loss', mode='auto', restore_best_weights=True)\n",
    "model.fit(X_train, y_train, validation_data=(X_train, y_train), \n",
    "          epochs=100, batch_size=128, verbose=1, callbacks=[es])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|████████████████████████████████████████████████████████████████████████████████| 100/100 [00:15<00:00,  6.67it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.12859090614447166 0.0017708181930074153\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n"
     ]
    }
   ],
   "source": [
    "### COMPUTE STOCHASTIC DROPOUT ###\n",
    "\n",
    "scores = []\n",
    "for i in tqdm.tqdm(range(0,100)):\n",
    "    scores.append(mean_absolute_error(y_test, model.predict(X_test).ravel()))\n",
    "\n",
    "print(np.mean(scores), np.std(scores))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [],
   "source": [
    "results['LSTM'] = {'mean':np.mean(scores), 'std':np.std(scores)}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(None, None)"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "### PLOT AVG AND UNCERTAINTY OF RESULTS ###\n",
    "\n",
    "bar = plt.bar([0,1], [results['AE+LSTM']['mean'], results['LSTM']['mean']], \n",
    "              yerr=[results['AE+LSTM']['std'], results['LSTM']['std']])\n",
    "plt.xticks([0,1], ['AE+LSTM','LSTM'], rotation=90)\n",
    "bar[0].set_color('cyan'), bar[1].set_color('magenta')"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
